import datetime
from typing import Any, MutableMapping

import jwt
from app.exceptions.http_resp import HttpResp
from app.exceptions.exception import AppException
from fastapi import Request
from app.config.settings import get_settings
from app.modules.auth.config import TokenType
from app.modules.auth.schema import PayloadSchema
'''
Header 用于设置签名算法及令牌类型，默认签名算法为 「 HS256 」，令牌类型可以设置为「 JWT 」

Payload 用于设置需要传递的数据，包含：iss 签发人、exp 过期时间、iat 签发时间等

iss (issuer)：发行者。
sub (subject)：主题，即该JWT所面向的对象。
aud (audience)：受众，即该JWT的目标接收者。
exp (expiration time)：过期时间。
nbf (not before)：生效时间。
iat (issued at)：签发时间。
jti (JWT ID)：唯一标识符。


Signature 用于对 Header 和 Payload 进行签名，默认使用的签名算法为 Header 中指定的算法
'''


class Validate():
    # def __init__(self, access_token: str | None = None, refresh_token: str | None = None) -> None:
    #     self.access_token = access_token
    #     self.refresh_token = refresh_token

    def validate_access_token(self,access_token: str):
        '''验证token'''
      
        # 解析负载
        try:
            payload = jwt.decode(access_token, get_settings().SECRET_KEY,
                                 algorithms=[get_settings().ALGORITHM])
        except Exception as e:
            raise AppException(exc=HttpResp.FAILED, msg="token参数无效")
        # 是access_token | refresh_token
        token_type = payload.get("token_type", TokenType.access_token)

        # token 无效token
        self._invalidate_token(access_token)

        # token 过期验证
        self._expiration_token(access_token)

    def validate_refresh_token(self):
        pass

    def _parse_payload(self, token: str) -> MutableMapping[str, Any]:
        '''解析负载'''
        return jwt.decode(token, get_settings().SECRET_KEY, algorithms=[get_settings().ALGORITHM])

    def _invalidate_token(self, token: str):
        '''无效验证'''
        pass

    def _expiration_token(self, token: str):
        '''过期验证'''
        try:
            current_time = datetime.datetime.now()
            if current_time > datetime.datetime.fromtimestamp(self._parse_payload(token).get("exp", 0)):
                raise BaseException("token过期")
            pass
        except Exception as e:
            pass
        finally:
            pass
        pass

    def parse_token(self, request: Request):
        '''验证token 是否存在'''

        authorization = request.headers.get("Authorization")
        print("authorization", authorization)
        # if not authorization:
        #     # raise AppException(HttpResp.TOKEN_EMPTY)
        #     raise JWTException(status_code=404, detail="token参数为空")

        # return authorization.split(" ")[1]
        return "asdfasdfasdf"
